home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-13 / mg2a_src.zip / KEYMAP.C < prev    next >
C/C++ Source or Header  |  1988-08-23  |  30KB  |  1,156 lines

  1. /*
  2.  * Keyboard maps.  This is character set dependent.
  3.  * The terminal specific parts of building the
  4.  * keymap has been moved to a better place.
  5.  */
  6. #include    "def.h"
  7. #include    "kbd.h"
  8.  
  9. /*
  10.  * Defined by "basic.c".
  11.  */
  12. extern    int    gotobol();        /* Move to start of line    */
  13. extern    int    backchar();        /* Move backward by characters    */
  14. extern    int    gotoeol();        /* Move to end of line        */
  15. extern    int    forwchar();        /* Move forward by characters    */
  16. extern    int    gotobob();        /* Move to start of buffer    */
  17. extern    int    gotoeob();        /* Move to end of buffer    */
  18. extern    int    forwline();        /* Move forward by lines    */
  19. extern    int    backline();        /* Move backward by lines    */
  20. extern    int    forwpage();        /* Move forward by pages    */
  21. extern    int    backpage();        /* Move backward by pages    */
  22. extern    int    pagenext();        /* Page forward next window    */
  23. extern    int    setmark();        /* Set mark            */
  24. extern    int    swapmark();        /* Swap "." and mark        */
  25. extern    int    gotoline();        /* Go to a specified line.    */
  26. #ifdef    GOSMACS
  27. extern    int    forw1page();        /* move forward by lines    */
  28. extern    int    back1page();        /* move back by lines        */
  29. #endif
  30.  
  31. /*
  32.  * Defined by "buffer.c".
  33.  */
  34. extern    int    listbuffers();        /* Display list of buffers    */
  35. extern    int    usebuffer();        /* Switch a window to a buffer    */
  36. extern    int    poptobuffer();        /* Other window to a buffer    */
  37. extern    int    killbuffer();        /* Make a buffer go away.    */
  38. extern    int    savebuffers();        /* Save unmodified buffers    */
  39. extern    int    bufferinsert();        /* Insert buffer into another    */
  40. extern    int    notmodified();        /* Reset modification flag    */
  41.  
  42. #ifndef NO_DIR
  43. /*
  44.  * Defined by "dir.c"
  45.  */
  46. extern    int    changedir();        /* change current directory    */
  47. extern    int    showcwdir();        /* show current directory    */
  48.  
  49. #ifndef NO_DIRED
  50. /*
  51.  * defined by "dired.c"
  52.  */
  53. extern    int    dired();        /* dired            */
  54. extern    int    d_findfile();        /* dired find file        */
  55. extern    int    d_del();        /* dired mark for deletion    */
  56. extern    int    d_undel();        /* dired unmark            */
  57. extern    int    d_undelbak();        /* dired unmark backwards    */
  58. extern    int    d_expunge();        /* dired expunge        */
  59. extern    int    d_copy();        /* dired copy            */
  60. extern    int    d_rename();        /* dired rename            */
  61. extern    int    d_otherwindow();    /* dired other window        */
  62. extern    int    d_ffotherwindow();    /* dired find file other window */
  63. #endif
  64. #endif
  65.  
  66. /*
  67.  * Defined by "extend.c".
  68.  */
  69. extern    int    extend();        /* Extended commands.        */
  70. extern    int    bindtokey();        /* Modify global key bindings.    */
  71. extern    int    localbind();        /* Modify mode key bindings.    */
  72. extern    int    define_key();        /* modify any key map        */
  73. extern    int    unbindtokey();        /* delete global binding    */
  74. extern    int    localunbind();        /* delete local binding        */
  75. extern    int    insert();        /* insert string        */
  76. #ifndef NO_STARTUP
  77. extern    int    evalexpr();        /* Extended commands (again)    */
  78. extern    int    evalbuffer();        /* Evaluate current buffer    */
  79. extern    int    evalfile();        /* Evaluate a file        */
  80. #endif
  81.  
  82. /*
  83.  * Defined by "file.c".
  84.  */
  85. extern    int    filevisit();        /* Get a file, read write    */
  86. extern    int    poptofile();        /* Get a file, other window    */
  87. extern    int    filewrite();        /* Write a file            */
  88. extern    int    filesave();        /* Save current file        */
  89. extern    int    fileinsert();        /* Insert file into buffer    */
  90. #ifndef NO_BACKUP
  91. extern    int    makebkfile();        /* Control backups on saves    */
  92. #endif
  93.  
  94. /*
  95.  * defined by help.c
  96.  */
  97. #ifndef NO_HELP
  98. extern    int    desckey();        /* describe key            */
  99. extern    int    wallchart();        /* Make wall chart.        */
  100. extern    int    help_help();        /* help help            */
  101. extern    int    apropos_command();    /* apropos            */
  102. #endif
  103.  
  104. /*
  105.  * defined by "kbd.c"
  106.  */
  107. #ifdef    DO_METAKEY
  108. extern    int    do_meta();        /* interpret meta keys        */
  109. #endif
  110. #ifdef    BSMAP
  111. extern    int    bsmap();        /* backspace mapping        */
  112. #endif
  113. extern    int    universal_argument();    /* Ctrl-U            */
  114. extern    int    digit_argument();    /* M-1, etc.            */
  115. extern    int    negative_argument();    /* M--                */
  116. extern    int    selfinsert();        /* Insert character        */
  117. extern    int    rescan();        /* internal try again function    */
  118.  
  119. /*
  120.  * defined by "macro.c"
  121.  */
  122. #ifndef NO_MACRO
  123. extern    int    definemacro();        /* Begin macro            */
  124. extern    int    finishmacro();        /* End macro            */
  125. extern    int    executemacro();        /* Execute macro        */
  126. #endif
  127.  
  128. /*
  129.  * Defined by "main.c".
  130.  */
  131. extern    int    ctrlg();        /* Abort out of things        */
  132. extern    int    quit();            /* Quit                */
  133.  
  134. /*
  135.  * Defined by "match.c"
  136.  */
  137. extern    int    showmatch();        /* Hack to show matching paren     */
  138.  
  139. /* defined by "modes.c" */
  140.  
  141. extern    int    indentmode();        /* set auto-indent mode        */
  142. extern    int    fillmode();        /* set word-wrap mode        */
  143. extern    int    blinkparen();        /* Fake blink-matching-paren var */
  144. #ifdef    NOTAB
  145. extern    int    notabmode();        /* no tab mode            */
  146. #endif
  147. extern    int    overwrite();        /* overwrite mode        */
  148. extern    int    set_default_mode();    /* set default modes        */
  149.  
  150. /*
  151.  * defined by "paragraph.c" - the paragraph justification code.
  152.  */
  153. extern    int    gotobop();        /* Move to start of paragraph.    */
  154. extern    int    gotoeop();        /* Move to end of paragraph.    */
  155. extern    int    fillpara();        /* Justify a paragraph.        */
  156. extern    int    killpara();        /* Delete a paragraph.        */
  157. extern    int    setfillcol();        /* Set fill column for justify. */
  158. extern    int    fillword();        /* Insert char with word wrap.    */
  159.  
  160. /*
  161.  * Defined by "random.c".
  162.  */
  163. extern    int    showcpos();        /* Show the cursor position    */
  164. extern    int    twiddle();        /* Twiddle characters        */
  165. extern    int    quote();        /* Insert literal        */
  166. extern    int    openline();        /* Open up a blank line        */
  167. extern    int    newline();        /* Insert newline        */
  168. extern    int    deblank();        /* Delete blank lines        */
  169. extern    int    justone();        /* Delete extra whitespace    */
  170. extern    int    delwhite();        /* Delete all whitespace    */
  171. extern    int    indent();        /* Insert newline, then indent    */
  172. extern    int    forwdel();        /* Forward delete        */
  173. extern    int    backdel();        /* Backward delete in        */
  174. extern    int    killline();        /* Kill forward            */
  175. extern    int    yank();            /* Yank back from killbuffer.    */
  176. #ifdef NOTAB
  177. extern    int    space_to_tabstop();
  178. #endif
  179.  
  180. #ifdef    REGEX
  181. /*
  182.  * Defined by "re_search.c"
  183.  */
  184. extern    int    re_forwsearch();    /* Regex search forward         */
  185. extern    int    re_backsearch();    /* Regex search backwards     */
  186. extern    int    re_searchagain();    /* Repeat regex search command     */
  187. extern    int    re_queryrepl();        /* Regex query replace         */
  188. extern    int    setcasefold();        /* Set case fold in searches     */
  189. extern    int    delmatchlines();    /* Delete all lines matching     */
  190. extern    int    delnonmatchlines();    /* Delete all lines not matching */
  191. extern    int    cntmatchlines();    /* Count matching lines         */
  192. extern    int    cntnonmatchlines();    /* Count nonmatching lines     */
  193. #endif
  194.  
  195. /*
  196.  * Defined by "region.c".
  197.  */
  198. extern    int    killregion();        /* Kill region.            */
  199. extern    int    copyregion();        /* Copy region to kill buffer.    */
  200. extern    int    lowerregion();        /* Lower case region.        */
  201. extern    int    upperregion();        /* Upper case region.        */
  202. #ifdef    PREFIXREGION
  203. extern    int    prefixregion();        /* Prefix all lines in region    */
  204. extern    int    setprefix();        /* Set line prefix string    */
  205. #endif
  206.  
  207. /*
  208.  * Defined by "search.c".
  209.  */
  210. extern    int    forwsearch();        /* Search forward        */
  211. extern    int    backsearch();        /* Search backwards        */
  212. extern    int    searchagain();        /* Repeat last search command    */
  213. extern    int    forwisearch();        /* Incremental search forward    */
  214. extern    int    backisearch();        /* Incremental search backwards */
  215. extern    int    queryrepl();        /* Query replace        */
  216.  
  217. /*
  218.  * Defined by "spawn.c".
  219.  */
  220. extern    int    spawncli();        /* Run CLI in a subjob.        */
  221. #ifdef    VMS
  222. extern    int    attachtoparent();    /* Attach to parent process    */
  223. #endif
  224.  
  225. /* defined by "version.c" */
  226.  
  227. extern    int    showversion();        /* Show version numbers, etc.    */
  228.  
  229. /*
  230.  * Defined by "window.c".
  231.  */
  232. extern    int    reposition();        /* Reposition window        */
  233. extern    int    refresh();        /* Refresh the screen        */
  234. extern    int    nextwind();        /* Move to the next window    */
  235. #ifdef    GOSMACS
  236. extern    int    prevwind();        /* Move to the previous window    */
  237. #endif
  238. extern    int    onlywind();        /* Make current window only one */
  239. extern    int    splitwind();        /* Split current window        */
  240. extern    int    delwind();        /* Delete current window    */
  241. extern    int    enlargewind();        /* Enlarge display window.    */
  242. extern    int    shrinkwind();        /* Shrink window.        */
  243.  
  244. /*
  245.  * Defined by "word.c".
  246.  */
  247. extern    int    backword();        /* Backup by words        */
  248. extern    int    forwword();        /* Advance by words        */
  249. extern    int    upperword();        /* Upper case word.        */
  250. extern    int    lowerword();        /* Lower case word.        */
  251. extern    int    capword();        /* Initial capitalize word.    */
  252. extern    int    delfword();        /* Delete forward word.        */
  253. extern    int    delbword();        /* Delete backward word.    */
  254.  
  255. #ifdef    AMIGA
  256. #ifdef    DO_ICONIFY
  257. extern    int tticon();
  258. #endif
  259. #ifdef    DO_MENU
  260. extern    int    amigamenu();        /* Menu function        */
  261. #endif
  262. #ifdef    MOUSE
  263. extern    int    amigamouse();        /* Amiga mouse functions    */
  264. extern    int    mgotobob();
  265. extern    int    mforwdel();
  266. extern    int    mdelwhite();
  267. extern    int    mdelwind();
  268. extern    int    mgotoeob();
  269. extern    int    menlargewind();
  270. extern    int    mkillline();
  271. extern    int    mkillregion();
  272. extern    int    mdelfword();
  273. extern    int    mreposition();
  274. extern    int    mbackpage();
  275. extern    int    mforwpage();
  276. extern    int    mshrinkwind();
  277. extern    int    msplitwind();
  278. extern    int    myank();
  279. #endif    MOUSE
  280.  
  281. extern    int    togglewindow();        /* Defined by "ttyio.c"        */
  282. extern    int    togglezooms();        /*    ""         ""        */
  283.  
  284. #ifdef    CHANGE_FONT
  285. extern    int    setfont();        /* Defined by "ttyio.c"        */
  286. #endif
  287.  
  288. #ifdef    CHANGE_COLOR
  289.     /* functions to mess with the mode line rendition, window colors*/
  290. extern    int    ttmode();        /* Defined by "tty.c"        */
  291. extern    int    tttext();        /*  ""                */
  292. extern    int    textforeground();    /*  ""                */
  293. extern    int    textbackground();    /*  ""                */
  294. extern    int    modeforeground();    /*  ""                */
  295. extern    int    modebackground();    /*  ""                */
  296. #endif
  297.  
  298. /*
  299.  * This file contains map segment definitions for adding function keys to
  300.  * keymap declarations.  Currently you can add things to the fundamental
  301.  * mode keymap and the dired mode keymap.  See the declaration of
  302.  * diredmap and fundmap for details.
  303.  */
  304. #include "amiga_maps.c"
  305.  
  306. #endif    /* AMIGA */
  307.  
  308. /* initial keymap declarations, deepest first */
  309.  
  310. #ifndef NO_HELP
  311. static    PF    cHcG[] = {
  312.     ctrlg,        /* ^G */
  313.     help_help,    /* ^H */
  314. };
  315. static    PF    cHa[]    = {
  316.     apropos_command,/* a */
  317.     wallchart,    /* b */
  318.     desckey,    /* c */
  319. };
  320. static    struct    KEYMAPE(2+IMAPEXT)    helpmap = {
  321.     2,
  322.     2+IMAPEXT,
  323.     rescan,
  324.     {
  325.         {CCHR('G'),CCHR('H'),    cHcG,    (KEYMAP *)NULL},
  326.         {'a',    'c',        cHa,    (KEYMAP *)NULL},
  327.     }
  328. };
  329. #endif
  330.  
  331. static    PF    cX4cF[] = {
  332.     poptofile,    /* ^f */
  333.     ctrlg,        /* ^g */
  334. };
  335. static    PF    cX4b[] = {
  336.     poptobuffer,    /* b */
  337.     rescan,        /* c */
  338.     rescan,        /* d */
  339.     rescan,        /* e */
  340.     poptofile,    /* f */
  341. };
  342. static    struct    KEYMAPE(2+IMAPEXT)    cX4map    = {
  343.     2,
  344.     2+IMAPEXT,
  345.     rescan,
  346.     {
  347.         {CCHR('F'),CCHR('G'),    cX4cF,    (KEYMAP *)NULL},
  348.         {'b',    'f',        cX4b,    (KEYMAP *)NULL},
  349.     }
  350. };
  351.  
  352. static    PF    cXcB[] = {
  353.     listbuffers,    /* ^B */
  354.     quit,        /* ^C */
  355.     rescan,        /* ^D */
  356.     rescan,        /* ^E */
  357.     filevisit,    /* ^F */
  358.     ctrlg,        /* ^G */
  359. };
  360. static    PF    cXcL[] = {
  361.     lowerregion,    /* ^L */
  362.     rescan,        /* ^M */
  363.     rescan,        /* ^N */
  364.     deblank,    /* ^O */
  365.     rescan,        /* ^P */
  366.     rescan,        /* ^Q */
  367.     rescan,        /* ^R */
  368.     filesave,    /* ^S */
  369.     rescan,        /* ^T */
  370.     upperregion,    /* ^U */
  371.     rescan,        /* ^V */
  372.     filewrite,    /* ^W */
  373.     swapmark,    /* ^X */
  374. };
  375. #ifndef NO_MACRO
  376. static    PF    cXlp[]    = {
  377.     definemacro,    /* ( */
  378.     finishmacro,    /* ) */
  379. };
  380. #endif
  381. static    PF    cX0[]    = {
  382.     delwind,    /* 0 */
  383.     onlywind,    /* 1 */
  384.     splitwind,    /* 2 */
  385.     rescan,        /* 3 */
  386.     prefix,        /* 4 */
  387. };
  388. static    PF    cXeq[]    = {
  389.     showcpos,    /* = */
  390. };
  391. static    PF    cXcar[] = {
  392.     enlargewind,    /* ^ */
  393.     rescan,        /* _ */
  394.     rescan,        /* ` */
  395.     rescan,        /* a */
  396.     usebuffer,    /* b */
  397.     rescan,        /* c */
  398. #ifndef NO_DIRED
  399.     dired,        /* d */
  400. #else
  401.     rescan,        /* d */
  402. #endif
  403. #ifndef NO_MACRO
  404.     executemacro,    /* e */
  405. #else
  406.     rescan,        /* e */
  407. #endif
  408.     setfillcol,    /* f */
  409.     rescan,        /* g */
  410.     rescan,        /* h */
  411.     fileinsert,    /* i */
  412.     rescan,        /* j */
  413.     killbuffer,    /* k */
  414.     rescan,        /* l */
  415.     rescan,        /* m */
  416.     rescan,        /* n */
  417.     nextwind,    /* o */
  418.     rescan,        /* p */
  419.     rescan,        /* q */
  420.     rescan,        /* r */
  421.     savebuffers,    /* s */
  422. };
  423. #ifndef NO_MACRO
  424. static    struct    KEYMAPE(6+IMAPEXT)    cXmap = {
  425.     6,
  426.     6+IMAPEXT,
  427. #else
  428. static    struct    KEYMAPE(5+IMAPEXT)    cXmap = {
  429.     5,
  430.     5+IMAPEXT,
  431. #endif
  432.     rescan,
  433.     {
  434.         {CCHR('B'),CCHR('G'),    cXcB,    (KEYMAP *)NULL},
  435.         {CCHR('L'),CCHR('X'),    cXcL,    (KEYMAP *)NULL},
  436. #ifndef NO_MACRO
  437.         {'(',    ')',        cXlp,    (KEYMAP *)NULL},
  438. #endif
  439.         {'0',    '4',        cX0,    (KEYMAP *)&cX4map},
  440.         {'=',    '=',        cXeq,    (KEYMAP *)NULL},
  441.         {'^',    's',        cXcar,    (KEYMAP *)NULL},
  442.     }
  443. };
  444.  
  445. static    PF    metacG[] = {
  446.     ctrlg,        /* ^G */
  447. };
  448. static    PF    metacV[] = {
  449.     pagenext,    /* ^V */
  450. };
  451. static    PF    metasp[] = {
  452.     justone,    /* space */
  453. };
  454. static    PF    metapct[] = {
  455.     queryrepl,    /* % */
  456. };
  457. static    PF    metami[] = {
  458.     negative_argument,    /* - */
  459.     rescan,        /* . */
  460.     rescan,        /* / */
  461.     digit_argument, /* 0 */
  462.     digit_argument, /* 1 */
  463.     digit_argument, /* 2 */
  464.     digit_argument, /* 3 */
  465.     digit_argument, /* 4 */
  466.     digit_argument, /* 5 */
  467.     digit_argument, /* 6 */
  468.     digit_argument, /* 7 */
  469.     digit_argument, /* 8 */
  470.     digit_argument, /* 9 */
  471.     rescan,        /* : */
  472.     rescan,        /* ; */
  473.     gotobob,    /* < */
  474.     rescan,        /* = */
  475.     gotoeob,    /* > */
  476. };
  477. static    PF    metalb[] = {
  478.     gotobop,    /* [ */
  479.     delwhite,    /* \ */
  480.     gotoeop,    /* ] */
  481.     rescan,        /* ^ */
  482.     rescan,        /* _ */
  483.     rescan,        /* ` */
  484.     rescan,        /* a */
  485.     backword,    /* b */
  486.     capword,    /* c */
  487.     delfword,    /* d */
  488.     rescan,        /* e */
  489.     forwword,    /* f */
  490. };
  491. static    PF    metal[] = {
  492.     lowerword,    /* l */
  493.     rescan,        /* m */
  494.     rescan,        /* n */
  495.     rescan,        /* o */
  496.     rescan,        /* p */
  497.     fillpara,    /* q */
  498.     backsearch,    /* r */
  499.     forwsearch,    /* s */
  500.     rescan,        /* t */
  501.     upperword,    /* u */
  502.     backpage,    /* v */
  503.     copyregion,    /* w */
  504.     extend,        /* x */
  505. };
  506. static    PF    metatilde[] = {
  507.     notmodified,    /* ~ */
  508.     delbword,    /* DEL */
  509. };
  510. static    struct    KEYMAPE(8+IMAPEXT)    metamap = {
  511.     8,
  512.     8+IMAPEXT,
  513.     rescan,
  514.     {
  515.         {CCHR('G'),CCHR('G'),    metacG, (KEYMAP *)NULL},
  516.         {CCHR('V'),CCHR('V'),    metacV, (KEYMAP *)NULL},
  517.         {' ',    ' ',        metasp, (KEYMAP *)NULL},
  518.         {'%',    '%',        metapct,(KEYMAP *)NULL},
  519.         {'-',    '>',        metami, (KEYMAP *)NULL},
  520.         {'[',    'f',        metalb, (KEYMAP *)NULL},
  521.         {'l',    'x',        metal,    (KEYMAP *)NULL},
  522.         {'~',    CCHR('?'),    metatilde,(KEYMAP *)NULL},
  523.     }
  524. };
  525.  
  526. static    PF    fund_at[] = {
  527.     setmark,    /* ^@ */
  528.     gotobol,    /* ^A */
  529.     backchar,    /* ^B */
  530.     rescan,        /* ^C */
  531.     forwdel,    /* ^D */
  532.     gotoeol,    /* ^E */
  533.     forwchar,    /* ^F */
  534.     ctrlg,        /* ^G */
  535. #ifndef NO_HELP
  536.     prefix,        /* ^H */
  537. #else
  538.     rescan,        /* ^H */
  539. #endif
  540. };
  541. /* ^I is selfinsert */
  542. static    PF    fund_CJ[] = {
  543.     indent,        /* ^J */
  544.     killline,    /* ^K */
  545.     reposition,    /* ^L */
  546.     newline,    /* ^M */
  547.     forwline,    /* ^N */
  548.     openline,    /* ^O */
  549.     backline,    /* ^P */
  550.     quote,        /* ^Q */
  551.     backisearch,    /* ^R */
  552.     forwisearch,    /* ^S */
  553.     twiddle,    /* ^T */
  554.     universal_argument,    /* ^U */
  555.     forwpage,    /* ^V */
  556.     killregion,    /* ^W */
  557.     prefix,        /* ^X */
  558.     yank,        /* ^Y */
  559. #ifndef VMS
  560.     spawncli,    /* ^Z */
  561. #else
  562.     attachtoparent, /* ^Z */
  563. #endif
  564. };
  565. static    PF    fund_esc[] = {
  566.     prefix,        /* esc */
  567.     rescan,        /* ^\ */    /* selfinsert is default on fundamental */
  568.     rescan,        /* ^] */
  569.     rescan,        /* ^^ */
  570.     rescan,        /* ^_ */
  571. };
  572. static    PF    fund_del[] = {
  573.     backdel,    /* DEL */
  574. };
  575.  
  576. #ifndef    FUND_XMAPS
  577. #define NFUND_XMAPS    0    /* extra map sections after normal ones */
  578. #endif
  579.  
  580. static    struct    KEYMAPE(4+NFUND_XMAPS+IMAPEXT)    fundmap = {
  581.     4 + NFUND_XMAPS,
  582.     4 + NFUND_XMAPS + IMAPEXT,
  583.     selfinsert,
  584.     {
  585. #ifndef NO_HELP
  586.         {CCHR('@'),CCHR('H'),    fund_at, (KEYMAP *)&helpmap},
  587. #else
  588.         {CCHR('@'),CCHR('H'),    fund_at, (KEYMAP *)NULL},
  589. #endif
  590.         {CCHR('J'),CCHR('Z'),    fund_CJ, (KEYMAP *)&cXmap},
  591.         {CCHR('['),CCHR('_'),    fund_esc,(KEYMAP *)&metamap},
  592.         {CCHR('?'),CCHR('?'),    fund_del,(KEYMAP *)NULL},
  593. #ifdef    FUND_XMAPS
  594.         FUND_XMAPS,
  595. #endif
  596.     }
  597. };
  598.  
  599. static    PF    fill_sp[] = {
  600.     fillword,    /* ' ' */
  601. };
  602. static struct KEYMAPE(1+IMAPEXT)    fillmap = {
  603.     1,
  604.     1+IMAPEXT,
  605.     rescan,
  606.     {
  607.         {' ',    ' ',    fill_sp,    (KEYMAP *)NULL},
  608.     }
  609. };
  610.  
  611. static    PF    indent_lf[] = {
  612.     newline,    /* ^J */
  613.     rescan,        /* ^K */
  614.     rescan,        /* ^L */
  615.     indent,        /* ^M */
  616. };
  617. static    struct    KEYMAPE(1+IMAPEXT)    indntmap = {
  618.     1,
  619.     1+IMAPEXT,
  620.     rescan,
  621.     {
  622.         {CCHR('J'), CCHR('M'),    indent_lf,    (KEYMAP *)NULL},
  623.     }
  624. };
  625. static    PF    blink_rp[] = {
  626.     showmatch,    /* ) */
  627. };
  628. static    struct    KEYMAPE(1+IMAPEXT)    blinkmap = {
  629.     1,
  630.     1+IMAPEXT,
  631.     rescan,
  632.     {
  633.         {')',    ')',    blink_rp,    (KEYMAP *)NULL},
  634.     }
  635. };
  636.  
  637. #ifdef    NOTAB
  638. static    PF    notab_tab[] = {
  639.     space_to_tabstop,    /* ^I */
  640. };
  641. static    struct    KEYMAPE(1+IMAPEXT)    notabmap = {
  642.     1,
  643.     1+IMAPEXT,
  644.     rescan,
  645.     {
  646.         {CCHR('I'),CCHR('I'),    notab_tab,    (KEYMAP *)NULL},
  647.     }
  648. };
  649. #endif
  650.  
  651. static    struct    KEYMAPE(1+IMAPEXT)    overwmap = {
  652.     0,
  653.     1+IMAPEXT,            /* 1 to avoid 0 sized array */
  654.     rescan,
  655.     {
  656.         /* unused dummy entry for VMS C */
  657.         {(KCHAR)0,    (KCHAR)0, (PF *)NULL,    (KEYMAP *)NULL},
  658.     }
  659. };
  660.  
  661. #ifndef NO_DIRED
  662. static    PF    dirednul[] = {
  663.     setmark,    /* ^@ */
  664.     gotobol,    /* ^A */
  665.     backchar,    /* ^B */
  666.     rescan,        /* ^C */
  667.     d_del,        /* ^D */
  668.     gotoeol,    /* ^E */
  669.     forwchar,    /* ^F */
  670.     ctrlg,        /* ^G */
  671. #ifndef NO_HELP
  672.     prefix,        /* ^H */
  673. #endif
  674. };
  675. static    PF    diredcl[] = {
  676.     reposition,    /* ^L */
  677.     forwline,    /* ^M */
  678.     forwline,    /* ^N */
  679.     rescan,        /* ^O */
  680.     backline,    /* ^P */
  681.     rescan,        /* ^Q */
  682.     backisearch,    /* ^R */
  683.     forwisearch,    /* ^S */
  684.     rescan,        /* ^T */
  685.     universal_argument, /* ^U */
  686.     forwpage,    /* ^V */
  687.     rescan,        /* ^W */
  688.     prefix,        /* ^X */
  689. };
  690. static    PF    diredcz[] = {
  691. #ifndef VMS
  692.     spawncli,    /* ^Z */
  693. #else
  694.     attachtoparent, /* ^Z */
  695. #endif
  696.     prefix,        /* esc */
  697.     rescan,        /* ^\ */
  698.     rescan,        /* ^] */
  699.     rescan,        /* ^^ */
  700.     rescan,        /* ^_ */
  701.     forwline,    /* SP */
  702. };
  703. static    PF    diredc[] = {
  704.     d_copy,        /* c */
  705.     d_del,        /* d */
  706.     d_findfile,    /* e */
  707.     d_findfile,    /* f */
  708. };
  709. static    PF    diredn[] = {
  710.     forwline,    /* n */
  711.     d_ffotherwindow,/* o */
  712.     backline,    /* p */
  713.     rescan,        /* q */
  714.     d_rename,    /* r */
  715.     rescan,        /* s */
  716.     rescan,        /* t */
  717.     d_undel,    /* u */
  718.     rescan,        /* v */
  719.     rescan,        /* w */
  720.     d_expunge,    /* x */
  721. };
  722. static    PF    direddl[] = {
  723.     d_undelbak,    /* del */
  724. };
  725.  
  726. #ifndef    DIRED_XMAPS
  727. #define    NDIRED_XMAPS    0    /* number of extra map sections */
  728. #endif
  729.  
  730. static    struct    KEYMAPE(6 + NDIRED_XMAPS + IMAPEXT)    diredmap = {
  731.     6 + NDIRED_XMAPS,
  732.     6 + NDIRED_XMAPS + IMAPEXT,
  733.     rescan,
  734.     {
  735. #ifndef NO_HELP
  736.         {CCHR('@'),    CCHR('H'),    dirednul, (KEYMAP *)&helpmap},
  737. #else
  738.         {CCHR('@'),    CCHR('G'),    dirednul, (KEYMAP *)NULL},
  739. #endif
  740.         {CCHR('L'),    CCHR('X'),    diredcl,  (KEYMAP *)&cXmap},
  741.         {CCHR('Z'),    ' ',        diredcz,  (KEYMAP *)&metamap},
  742.         {'c',        'f',        diredc,   (KEYMAP *)NULL},
  743.         {'n',        'x',        diredn,   (KEYMAP *)NULL},
  744.         {CCHR('?'),    CCHR('?'),    direddl,  (KEYMAP *)NULL},
  745. #ifdef    DIRED_XMAPS
  746.         DIRED_XMAPS,    /* map sections for dired mode keys    */
  747. #endif
  748.     }
  749. };
  750. #endif
  751.  
  752. /* give names to the maps, for use by help etc.
  753.  * If the map is to be bindable, it must also be listed in the
  754.  * function name table below with the same name.
  755.  * Maps created dynamicly currently don't get added here, thus are unnamed.
  756.  * Modes are just named keymaps with functions to add/subtract them from
  757.  * a buffer's list of modes.  If you change a mode name, change it in
  758.  * modes.c also.
  759.  */
  760.  
  761. MAPS    map_table[] = {
  762.     /* fundamental map MUST be first entry */
  763.     {(KEYMAP *)&fundmap,    "fundamental"},
  764.     {(KEYMAP *)&fillmap,    "fill"},
  765.     {(KEYMAP *)&indntmap,    "indent"},
  766.     {(KEYMAP *)&blinkmap,    "blink"},
  767. #ifdef    NOTAB
  768.     {(KEYMAP *)¬abmap,    "notab"},
  769. #endif
  770.     {(KEYMAP *)&overwmap,    "overwrite"},
  771.     {(KEYMAP *)&metamap,    "esc prefix"},
  772.     {(KEYMAP *)&cXmap,    "c-x prefix"},
  773.     {(KEYMAP *)&cX4map,    "c-x 4 prefix"},
  774. #ifndef NO_HELP
  775.     {(KEYMAP *)&helpmap,    "help"},
  776. #endif
  777. #ifndef NO_DIRED
  778.     {(KEYMAP *)&diredmap,    "dired"},
  779. #endif
  780. };
  781.  
  782. #define NMAPS    (sizeof map_table/sizeof(MAPS))
  783. int    nmaps = NMAPS;        /* for use by rebind in extend.c */
  784.  
  785. char *map_name(map)
  786. KEYMAP *map;
  787. {
  788.     MAPS *mp = &map_table[0];
  789.  
  790.     do {
  791.         if(mp->p_map == map) return mp->p_name;
  792.     } while(++mp < &map_table[NMAPS]);
  793.     return (char *)NULL;
  794. }
  795.  
  796. MAPS *name_mode(name)
  797. char *name;
  798. {
  799.     MAPS *mp = &map_table[0];
  800.  
  801.     do {
  802.         if(strcmp(mp->p_name,name)==0) return mp;
  803.     } while(++mp < &map_table[NMAPS]);
  804.     return (MAPS *)NULL;
  805. }
  806.  
  807. KEYMAP *name_map(name)
  808. char *name;
  809. {
  810.     MAPS *mp;
  811.     return (mp=name_mode(name))==NULL ? (KEYMAP *)NULL : mp->p_map;
  812. }
  813.  
  814. /* Warning: functnames MUST be in alphabetical order!  (due to binary
  815.  * search in name_function.)  If the function is prefix, it must be listed
  816.  * with the same name in the map_table above.
  817.  */
  818.  
  819. FUNCTNAMES    functnames[] = {
  820. #ifdef    AMIGA
  821. #ifdef    DO_ICONIFY
  822.     {tticon,    "amiga-iconify"},
  823. #endif
  824. #ifdef    DO_MENU
  825.     {amigamenu,    "amiga-menu"},
  826. #endif
  827. #ifdef    CHANGE_COLOR
  828.     {modebackground,"amiga-mode-background"},
  829.     {modeforeground,"amiga-mode-foreground"},
  830.     {ttmode,    "amiga-mode-rendition"},
  831. #endif
  832. #ifdef    CHANGE_FONT
  833.     {setfont,    "amiga-set-font"},
  834. #endif
  835. #ifdef    CHANGE_COLOR
  836.     {textbackground,"amiga-text-background"},
  837.     {textforeground,"amiga-text-foreground"},
  838.     {tttext,    "amiga-text-rendition"},
  839. #endif
  840.     {togglewindow,    "amiga-toggle-border"},
  841.     {togglezooms,    "amiga-zoom-mode"},
  842. #endif    /* AMIGA */
  843. #ifndef    NO_HELP
  844.     {apropos_command, "apropos"},
  845. #endif
  846.     {fillmode,    "auto-fill-mode"},
  847.     {indentmode,    "auto-indent-mode"},
  848.     {backchar,    "backward-char"},
  849.     {delbword,    "backward-kill-word"},
  850.     {gotobop,    "backward-paragraph"},
  851.     {backword,    "backward-word"},
  852.     {gotobob,    "beginning-of-buffer"},
  853.     {gotobol,    "beginning-of-line"},
  854.     {blinkparen,    "blink-matching-paren"},
  855.     {showmatch,    "blink-matching-paren-hack"},
  856. #ifdef    BSMAP
  857.     {bsmap,        "bsmap-mode"},
  858. #endif
  859.     {prefix,    "c-x 4 prefix"},
  860.     {prefix,    "c-x prefix"},
  861. #ifndef NO_MACRO
  862.     {executemacro,    "call-last-kbd-macro"},
  863. #endif
  864.     {capword,    "capitalize-word"},
  865. #ifndef NO_DIR
  866.     {changedir,    "cd"},
  867. #endif
  868.     {copyregion,    "copy-region-as-kill"},
  869. #ifdef    REGEX
  870.     {cntmatchlines, "count-matches"},
  871.     {cntnonmatchlines,"count-non-matches"},
  872. #endif
  873.     {define_key,    "define-key"},
  874.     {backdel,    "delete-backward-char"},
  875.     {deblank,    "delete-blank-lines"},
  876.     {forwdel,    "delete-char"},
  877.     {delwhite,    "delete-horizontal-space"},
  878. #ifdef    REGEX
  879.     {delmatchlines, "delete-matching-lines"},
  880.     {delnonmatchlines,"delete-non-matching-lines"},
  881. #endif
  882.     {onlywind,    "delete-other-windows"},
  883.     {delwind,    "delete-window"},
  884. #ifndef NO_HELP
  885.     {wallchart,    "describe-bindings"},
  886.     {desckey,    "describe-key-briefly"},
  887. #endif
  888.     {digit_argument,"digit-argument"},
  889. #ifndef NO_DIRED
  890.     {dired,        "dired"},
  891.     {d_undelbak,    "dired-backup-unflag"},
  892.     {d_copy,    "dired-copy-file"},
  893.     {d_expunge,    "dired-do-deletions"},
  894.     {d_findfile,    "dired-find-file"},
  895.     {d_ffotherwindow, "dired-find-file-other-window"},
  896.     {d_del,        "dired-flag-file-deleted"},
  897.     {d_otherwindow, "dired-other-window"},
  898.     {d_rename,    "dired-rename-file"},
  899.     {d_undel,    "dired-unflag"},
  900. #endif
  901.     {lowerregion,    "downcase-region"},
  902.     {lowerword,    "downcase-word"},
  903.     {showversion,    "emacs-version"},
  904. #ifndef NO_MACRO
  905.     {finishmacro,    "end-kbd-macro"},
  906. #endif
  907.     {gotoeob,    "end-of-buffer"},
  908.     {gotoeol,    "end-of-line"},
  909.     {enlargewind,    "enlarge-window"},
  910.     {prefix,    "esc prefix"},
  911. #ifndef NO_STARTUP
  912.     {evalbuffer,    "eval-current-buffer"},
  913.     {evalexpr,    "eval-expression"},
  914. #endif
  915.     {swapmark,    "exchange-point-and-mark"},
  916.     {extend,    "execute-extended-command"},
  917.     {fillpara,    "fill-paragraph"},
  918.     {filevisit,    "find-file"},
  919.     {poptofile,    "find-file-other-window"},
  920.     {forwchar,    "forward-char"},
  921.     {gotoeop,    "forward-paragraph"},
  922.     {forwword,    "forward-word"},
  923.     {bindtokey,    "global-set-key"},
  924.     {unbindtokey,    "global-unset-key"},
  925.     {gotoline,    "goto-line"},
  926. #ifndef NO_HELP
  927.     {prefix,    "help"},
  928.     {help_help,    "help-help"},
  929. #endif
  930.     {insert,    "insert"},
  931.     {bufferinsert,    "insert-buffer"},
  932.     {fileinsert,    "insert-file"},
  933.     {fillword,    "insert-with-wrap"},
  934.     {backisearch,    "isearch-backward"},
  935.     {forwisearch,    "isearch-forward"},
  936.     {justone,    "just-one-space"},
  937.     {ctrlg,        "keyboard-quit"},
  938.     {killbuffer,    "kill-buffer"},
  939.     {killline,    "kill-line"},
  940.     {killpara,    "kill-paragraph"},
  941.     {killregion,    "kill-region"},
  942.     {delfword,    "kill-word"},
  943.     {listbuffers,    "list-buffers"},
  944. #ifndef NO_STARTUP
  945.     {evalfile,    "load"},
  946. #endif
  947.     {localbind,    "local-set-key"},
  948.     {localunbind,    "local-unset-key"},
  949. #ifndef NO_BACKUP
  950.     {makebkfile,    "make-backup-files"},
  951. #endif
  952. #ifdef    DO_METAKEY
  953.     {do_meta,    "meta-key-mode"},    /* better name, anyone? */
  954. #endif
  955. #ifdef    AMIGA
  956. #ifdef    MOUSE
  957.     {mgotobob,    "mouse-beginning-of-buffer"},
  958.     {mforwdel,    "mouse-delete-char"},
  959.     {mdelwhite,    "mouse-delete-horizontal-space"},
  960.     {mdelwind,    "mouse-delete-window"},
  961.     {mgotoeob,    "mouse-end-of-buffer"},
  962.     {menlargewind,    "mouse-enlarge-window"},
  963.     {mkillline,    "mouse-kill-line"},
  964.     {mkillregion,    "mouse-kill-region"},
  965.     {mdelfword,    "mouse-kill-word"},
  966.     {mreposition,    "mouse-recenter"},
  967.     {mbackpage,    "mouse-scroll-down"},
  968.     {mforwpage,    "mouse-scroll-up"},
  969.     {amigamouse,    "mouse-set-point"},
  970.     {mshrinkwind,    "mouse-shrink-window"},
  971.     {msplitwind,    "mouse-split-window-vertically"},
  972.     {myank,        "mouse-yank"},
  973. #endif
  974. #endif
  975.     {negative_argument, "negative-argument"},
  976.     {newline,    "newline"},
  977.     {indent,    "newline-and-indent"},
  978.     {forwline,    "next-line"},
  979. #ifdef    NOTAB
  980.     {notabmode,    "no-tab-mode"},
  981. #endif
  982.     {notmodified,    "not-modified"},
  983.     {openline,    "open-line"},
  984.     {nextwind,    "other-window"},
  985.     {overwrite,    "overwrite-mode"},
  986. #ifdef    PREFIXREGION
  987.     {prefixregion,    "prefix-region"},
  988. #endif
  989.     {backline,    "previous-line"},
  990. #ifdef    GOSMACS
  991.     {prevwind,    "previous-window"},
  992. #endif
  993. #ifdef    VMS
  994.     {spawncli,    "push-to-dcl"},
  995. #endif
  996. #ifndef NO_DIR
  997.     {showcwdir,    "pwd"},
  998. #endif
  999.     {queryrepl,    "query-replace"},
  1000. #ifdef    REGEX
  1001.     {re_queryrepl,    "query-replace-regexp"},
  1002. #endif
  1003.     {quote,        "quoted-insert"},
  1004. #ifdef    REGEX
  1005.     {re_searchagain,"re-search-again"},
  1006.     {re_backsearch, "re-search-backward"},
  1007.     {re_forwsearch, "re-search-forward"},
  1008. #endif
  1009.     {reposition,    "recenter"},
  1010.     {refresh,    "redraw-display"},
  1011.     {filesave,    "save-buffer"},
  1012.     {quit,        "save-buffers-kill-emacs"},
  1013.     {savebuffers,    "save-some-buffers"},
  1014.     {backpage,    "scroll-down"},
  1015. #ifdef    GOSMACS
  1016.     {back1page,    "scroll-one-line-down"},
  1017.     {forw1page,    "scroll-one-line-up"},
  1018. #endif
  1019.     {pagenext,    "scroll-other-window"},
  1020.     {forwpage,    "scroll-up"},
  1021.     {searchagain,    "search-again"},
  1022.     {backsearch,    "search-backward"},
  1023.     {forwsearch,    "search-forward"},
  1024.     {selfinsert,    "self-insert-command"},
  1025. #ifdef    REGEX
  1026.     {setcasefold,    "set-case-fold-search"},
  1027. #endif
  1028.     {set_default_mode, "set-default-mode"},
  1029.     {setfillcol,    "set-fill-column"},
  1030.     {setmark,    "set-mark-command"},
  1031. #ifdef    PREFIXREGION
  1032.     {setprefix,    "set-prefix-string"},
  1033. #endif
  1034.     {shrinkwind,    "shrink-window"},
  1035. #ifdef    NOTAB
  1036.     {space_to_tabstop, "space-to-tabstop"},
  1037. #endif
  1038.     {splitwind,    "split-window-vertically"},
  1039. #ifndef NO_MACRO
  1040.     {definemacro,    "start-kbd-macro"},
  1041. #endif
  1042. #ifdef    VMS
  1043.     {attachtoparent,"suspend-emacs"},
  1044. #else
  1045.     {spawncli,    "suspend-emacs"},
  1046. #endif
  1047.     {usebuffer,    "switch-to-buffer"},
  1048.     {poptobuffer,    "switch-to-buffer-other-window"},
  1049.     {twiddle,    "transpose-chars"},
  1050.     {universal_argument, "universal-argument"},
  1051.     {upperregion,    "upcase-region"},
  1052.     {upperword,    "upcase-word"},
  1053.     {showcpos,    "what-cursor-position"},
  1054.     {filewrite,    "write-file"},
  1055.     {yank,        "yank"},
  1056. };
  1057.  
  1058. #define NFUNCT    (sizeof(functnames)/sizeof(FUNCTNAMES))
  1059.  
  1060. int    nfunct = NFUNCT;        /* used by help.c */
  1061.  
  1062. /*
  1063.  * The general-purpose version of ROUND2 blows osk C (2.0) out of the water.
  1064.  * (reboot required)  If you need to build a version of mg with less than 32
  1065.  * or more than 511 functions, something better must be done.
  1066.  * The version that should work, but doesn't is:
  1067.  * #define ROUND2(x) (1+((x>>1)|(x>>2)|(x>>3)|(x>>4)|(x>>5)|(x>>6)|(x>>7)|\
  1068.  *    (x>>8)|(x>>9)|(x>>10)|(x>>11)|(x>>12)|(x>>13)|(x>>14)|(x>>15)))
  1069.  */
  1070. #define ROUND2(x) (x<128?(x<64?32:64):(x<256?128:256))
  1071.  
  1072. static    name_fent(fname, flag)
  1073. register char *fname;
  1074. int    flag;
  1075. {
  1076.     register int    try;
  1077.     register int    x = ROUND2(NFUNCT);
  1078.     register int    base = 0;
  1079.     register int    notit;
  1080.  
  1081.     do {
  1082.         /* + can be used instead of | here if more efficent.    */
  1083.         if((try = base | x) < NFUNCT) {
  1084.         if((notit = strcmp(fname, functnames[try].n_name)) >= 0) {
  1085.             if(!notit) return try;
  1086.             base = try;
  1087.         }
  1088.         }
  1089.     } while((x>>=1) || (try==1 && base==0));    /* try 0 once if needed */
  1090.     return flag ? base : -1;
  1091. }
  1092.  
  1093. /*
  1094.  * Translate from function name to function pointer, using binary search.
  1095.  */
  1096.  
  1097. PF    name_function(fname)
  1098. char    *fname;
  1099. {
  1100.     int i;
  1101.     if((i = name_fent(fname, FALSE)) >= 0) return functnames[i].n_funct;
  1102.     return (PF)NULL;
  1103. }
  1104.  
  1105. /* complete function name */
  1106.  
  1107. complete_function(fname, c)
  1108. register char    *fname;
  1109. {
  1110.     register int i, j, k, l;
  1111.     int    oj;
  1112.  
  1113.     i = name_fent(fname, TRUE);
  1114.     for(j=0; (l=fname[j]) && functnames[i].n_name[j]==l; j++) {}
  1115.     if(fname[j]!='\0') {
  1116.         if(++i >= NFUNCT) return -2;    /* no match */
  1117.         for(j=0; (l=fname[j]) && functnames[i].n_name[j]==l; j++) {}
  1118.         if(fname[j]!='\0') return -2;    /* no match */
  1119.     }
  1120.     if(c==CCHR('M') && functnames[i].n_name[j]=='\0') return -1;
  1121.     for(k=i+1; k<NFUNCT; k++) {        /* find last match */
  1122.         for(l=0; functnames[k].n_name[l]==fname[l]; l++) {}
  1123.         if(l<j) break;
  1124.     }
  1125.     k--;
  1126.     oj = j;
  1127.     if(k>i) {                    /* multiple matches */
  1128.         while((l = functnames[i].n_name[j]) == functnames[k].n_name[j]) {
  1129.         fname[j++] = l;
  1130.         if(l=='-' && c==' ') break;
  1131.         }
  1132.         if(j==oj) return -3;            /* ambiguous    */
  1133.     } else {                    /* single match */
  1134.         while(l = functnames[i].n_name[j]) {
  1135.         fname[j++] = l;
  1136.         if(l=='-' && c==' ') break;
  1137.         }
  1138.     }
  1139.     fname[j] = '\0';
  1140.     return j - oj;
  1141. }
  1142.  
  1143. /* translate from function pointer to function name. */
  1144.  
  1145. char *function_name(fpoint)
  1146. register PF fpoint;
  1147. {
  1148.     register FUNCTNAMES    *fnp = &functnames[0];
  1149.  
  1150.     if(fpoint == prefix) return (char *)NULL;    /* ambiguous */
  1151.     do {
  1152.         if(fnp->n_funct == fpoint) return fnp->n_name;
  1153.     } while(++fnp < &functnames[NFUNCT]);
  1154.     return (char *)NULL;
  1155. }
  1156.